www.gusucode.com > VC++使用XOR 256算法对文件进行加密解密-源码程序 > VC++使用XOR 256算法对文件进行加密解密-源码程序/code/HexEnc_src/HexEncView.cpp
// HexEncView.cpp : implementation of the CHexView class // Download by http://www.NewXing.com #include "stdafx.h" #include "HexEnc.h" #include "HexEncDoc.h" #include "HexEncView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CHexView IMPLEMENT_DYNCREATE(CHexView, CView) BEGIN_MESSAGE_MAP(CHexView, CView) //{{AFX_MSG_MAP(CHexView) ON_WM_CREATE() ON_WM_VSCROLL() ON_WM_SIZE() ON_WM_KEYDOWN() ON_WM_MOUSEWHEEL() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CHexView construction/destruction CHexView::CHexView() { // TODO: add construction code here } CHexView::~CHexView() { } BOOL CHexView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style |= WS_VSCROLL; return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CHexView drawing void CHexView::OnDraw(CDC* pDC) { CHexDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here if (m_nLinesTotal != 0) { CRect rect; GetClientRect(&rect); UINT nStart = m_nVScrollPos / m_cyScreen; UINT nEnd = min (m_nLinesTotal, nStart + (rect.bottom + m_cyScreen - 1) / m_cyScreen); CFont* pOldFont = pDC->SelectObject (&m_fontScreen); for (UINT i=nStart; i<=nEnd; i++) { CString string; FormatLine (pDoc, i, string); pDC->TextOut (2, ((i - nStart) * m_cyScreen) + 2, string); } pDC->SelectObject (pOldFont); } } ///////////////////////////////////////////////////////////////////////////// // CHexView diagnostics #ifdef _DEBUG void CHexView::AssertValid() const { CView::AssertValid(); } void CHexView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CHexDoc* CHexView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHexDoc))); return (CHexDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CHexView message handlers void CHexView::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class UINT nDocLength = GetDocument()->GetDocumentLength(); m_nLinesTotal = (nDocLength + 15) / 16; UINT nVScrollMax = 0; m_nVScrollPos = 0; CRect rect; GetClientRect(&rect); m_nVPageSize = rect.bottom - rect.top; if(m_nVPageSize < (m_nLinesTotal * m_cyScreen)) { nVScrollMax = m_nLinesTotal * m_cyScreen - 1; m_nVScrollPos = min(m_nVScrollPos, nVScrollMax - m_nVPageSize); } SCROLLINFO si; si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; si.nMin = 0; si.nMax = nVScrollMax; si.nPos = m_nVScrollPos; si.nPage = m_nVPageSize; SetScrollInfo(SB_VERT, &si, TRUE); if(si.nMax == si.nMin) m_bScrollBar = FALSE; else m_bScrollBar = TRUE; } int CHexView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; m_bScrollBar = FALSE; m_fontScreen.CreatePointFont(100, _T("Courier New")); CClientDC dc(this); TEXTMETRIC tm; CFont* pOldFont = dc.SelectObject(&m_fontScreen); dc.GetTextMetrics(&tm); m_cyScreen = tm.tmHeight + tm.tmExternalLeading; dc.SelectObject(pOldFont); return 0; } void CHexView::FormatLine(CHexDoc* pDoc, UINT nLine, CString& string) { // // Get 16 bytes and format them for output. // BYTE b[17]; ::FillMemory (b, 16, 32); UINT nCount = pDoc->GetBytes (nLine * 16, 16, b); string.Format (_T ("%0.8X %0.2X %0.2X %0.2X %0.2X %0.2X %0.2X " \ "%0.2X %0.2X - %0.2X %0.2X %0.2X %0.2X %0.2X %0.2X %0.2X " \ "%0.2X "), nLine * 16, b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15]); // // Replace non-printable characters with periods. // for (UINT i=0; i<nCount; i++) { if (!::IsCharAlphaNumeric (b[i])) b[i] = 0x2E; } // // If less than 16 bytes were retrieved, erase to the end of the line. // b[nCount] = 0; string += b; if (nCount < 16) { UINT pos1 = 59; UINT pos2 = 60; UINT j = 16 - nCount; for (i=0; i<j; i++) { string.SetAt (pos1, _T (' ')); string.SetAt (pos2, _T (' ')); pos1 -= 3; pos2 -= 3; if (pos1 == 35) { string.SetAt (35, _T (' ')); string.SetAt (36, _T (' ')); pos1 = 33; pos2 = 34; } } } } void CHexView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default int nDelta; switch (nSBCode) { case SB_LINEUP: nDelta = -(int)m_cyScreen; break; case SB_PAGEUP: nDelta = -(int)m_nVPageSize; break; case SB_THUMBTRACK: nDelta = (int)nPos - (int)m_nVScrollPos; break; case SB_PAGEDOWN: nDelta = (int)m_nVPageSize; break; case SB_LINEDOWN: nDelta = (int)m_cyScreen; break; default: // Ignore other scroll bar messages return; } int nScrollPos = m_nVScrollPos + nDelta; UINT nMaxPos = m_nLinesTotal * m_cyScreen - m_nVPageSize + m_cyScreen * 2; if (nScrollPos < 0) nDelta = -(int)m_nVScrollPos; else if (nScrollPos > (int)nMaxPos) nDelta = (int)nMaxPos - (int)m_nVScrollPos; if (nDelta != 0) { m_nVScrollPos += nDelta; SetScrollPos (SB_VERT, m_nVScrollPos, TRUE); ScrollWindow (0, -nDelta); } CView::OnVScroll(nSBCode, nPos, pScrollBar); } void CHexView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); // TODO: Add your message handler code here UINT nVScrollMax = 0; m_nVScrollPos = 0; m_nVPageSize = cy; if(m_nVPageSize < (m_nLinesTotal * m_cyScreen)) { nVScrollMax = m_nLinesTotal * m_cyScreen - 1; m_nVScrollPos = min(m_nVScrollPos, nVScrollMax - m_nVPageSize); } SCROLLINFO si; si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; si.nMin = 0; si.nMax = nVScrollMax; si.nPos = m_nVScrollPos; si.nPage = m_nVPageSize; SetScrollInfo(SB_VERT, &si, TRUE); if(si.nMax == si.nMin) m_bScrollBar = FALSE; else m_bScrollBar = TRUE; } void CHexView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default if(!m_bScrollBar) return; SCROLLINFO si; switch(nChar) { case VK_UP: OnVScroll(SB_LINEUP, 0, GetScrollBarCtrl(SB_VERT)); break; case VK_DOWN: OnVScroll(SB_LINEDOWN, 0, GetScrollBarCtrl(SB_VERT)); break; case VK_PRIOR: OnVScroll(SB_PAGEUP, 0, GetScrollBarCtrl(SB_VERT)); break; case VK_NEXT: OnVScroll(SB_PAGEDOWN, 0, GetScrollBarCtrl(SB_VERT)); break; case VK_HOME: m_nVScrollPos = 0; si.fMask = SIF_POS; si.nPos = m_nVScrollPos; SetScrollInfo(SB_VERT, &si, TRUE); RedrawWindow(); break; case VK_END: m_nVScrollPos = m_nLinesTotal * m_cyScreen - m_nVPageSize + m_cyScreen * 2 ; si.fMask = SIF_POS; si.nPos = m_nVScrollPos; SetScrollInfo(SB_VERT, &si, TRUE); RedrawWindow(); break; } CView::OnKeyDown(nChar, nRepCnt, nFlags); } BOOL CHexView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { // TODO: Add your message handler code here and/or call default if(!m_bScrollBar) return FALSE; BOOL bUp = TRUE; int nDelta = zDelta; if (zDelta < 0) { bUp = FALSE; nDelta = -nDelta; } UINT nWheelScrollLines; ::SystemParametersInfo (SPI_GETWHEELSCROLLLINES, 0, &nWheelScrollLines, 0); if (nWheelScrollLines == WHEEL_PAGESCROLL) { SendMessage (WM_VSCROLL, MAKEWPARAM (bUp ? SB_PAGEUP : SB_PAGEDOWN, 0), 0); } else { int nLines = (nDelta * nWheelScrollLines) / WHEEL_DELTA; while (nLines--) SendMessage (WM_VSCROLL, MAKEWPARAM (bUp ? SB_LINEUP : SB_LINEDOWN, 0), 0); } return CView::OnMouseWheel(nFlags, zDelta, pt); }